# Решение второго отборочного этапа Прикладное программирование if...else — IT-Планета 2024

## Решение

Для решения данного задания использовались следующие технологии:
- Spring Boot (приложение)
- Spring Data JPA + Hibernate (ORM)
- PostgreSQL (База данных)
- Maven (сборка приложения)
- Swagger
- Docker
- Docker compose

## Что было реализовано
В данном проекте были реализованы несколько контроллеров (на этапе проектирования я принял решение отойти от 
ТЗ, так как контроллер Authentication имел никак не относящиеся методы к данному контексту).

Были полностью реализованы следующие контроллеры:
- Account (контроллер отвечает за регистрацию, логин и CRUD для аккаунтов)
- Region (контроллер отвечает за CRUD для регионов)
- RegionType (контроллер отвечает за CRUD для типов регионов)
- WeatherForecast (контроллер отвечает за CRUD для прогноза погоды)

К сожалению, возникли проеблемы с контроллером Weather. В документации было сложно понять,
как зависят регионы, погода и прогноз

Например:

```
GET - /region/weather/{regionld}

Получение информации о погоде в регионе {regionld} : "long" // Идентификатор региона
request Body { empty }
responce
Body { "id": "long", // Идентификатор региона "regionName": "string", // Название региона "temperature": "float", // Температура в регионе, °C "humidity": "float", // Влажность воздуха в регионе, % "windSpeed": "float", // Скорость ветра, м/с "weatherCondition": "string", // Текущее состояние погоды, доступные значения "CLEAR", "CLOUDY", "RAIN", "SNOW", "FOG", "STORM "precipitationAmount": "float", // Количество осадков, мм "measurementDateTime": "dateTime" //
Дата и время измерения погодных условий в формате ISO-8601 "weatherForecast": [forecastld], //
Массив идентификаторов объектов с прогнозом погоды на ближайшие дни }

```

```
POST - /region/weather Добавление погоды
request
Body { "regionId": "long", // Идентификатор региона "temperature": "float", // Температура в регионе, °C "humidity": "float", // Влажность воздуха в регионе, % "windSpeed": "float", // Скорость ветра, м/с "weatherCondition": "string", // Текущее состояние погоды, доступные значения "CLEAR", "CLOUDY", "RAIN", "SNOW", "FOG", "STORM" "precipitationAmount": "float", // Количество осадков, мм "measurementDateTime": "dateTime", //
Дата и время измерения погодных условий в формате ISO-8601 "weatherForecast": ["forecastId"]
// Массив идентификаторов объектов с прогнозом погоды на ближайшие дни } responce
{ "id": "long", // Уникальный идентификатор созданной записи о погоде в регионеа "temperature": "float", // Температура в регионе, °C "humidity": "float", / Влажность воздуха в регионе, % "windSpeed": "float", // Скорость ветра, м/с "weatherCondition": "string", // Текущее состояние погоды "precipitationAmount": "float", // Количество осадков, мм "measurementDateTime": "dateTime", // Дата и время измерения погодных условий "weatherForecast": ["forecastId"], // Массив идентификаторов объектов с прогнозом погоды на ближайшие дни }

```

Непонятно было, как относятся регионы и погоды друг к другу, так как добавление погоды
преполагает добавление новой погоды для региона, тогда какую погоду брать для региона, так
и не понял

TL;DR проблемы: непонятна связь, OneToOne или OneToMany

Возможно, я не до конца понял, что там происходит, поэтому будет очень круто, если будет
разбор заданий или что-то подобное :)

## Архитектура

Для реализации данного проекта я использовал паттерн репозиторий. Благодаря Spring Boot 
и удобства этого паттерна, можно намного проще создавать CRUD для различных моделей

Для авторизации я использовал сессии через cookie,которые сохраняются по парметру id.
Сами cookie хранятся в БД в таблице Account. Если пользователь авторизован, на сервере
провереяются куки от пользователся и куки на сервере. Если куки не совпадают, то приложение
не даёт доступ.

При авторизации, в случае новой сессии, куки презаписываются в БД для корректной работы

## Требования к проверке решений

Приложение запускается в docker-compose (приложение + база данных). В конфигурациях я
всё прописал, но продублирую сюда
### Для базы данных (PostgeSQL)
Хост: localhost

Порт: 5432

База данных: WeatherForecast

Имя пользователя: postgres

Пароль: postgres

### Для приложения (Spring Boot)
Хост: localhost

Порт: 8080

### Запуск приложения

```
docker compose up -d --build
```

### Swagger
```
http://localhost:8080/swagger-ui/index.html
```

### Telegram
https://t.me/alexeylush

### Соглашение

Я предоставляю
Организатору разрешение на использование, модификацию, публикацию проекта и
дальнейшее распространение, включая право на внесение изменений, дополнений,
предисловий, комментариев и любых других переработок.

Я гарантирую, что проект не нарушает действующее законодательство, не содержит
информации, дискредитирующей лиц или продукты, не вызывает судебных исков или
претензий, не нарушает прав и интересов третьих лиц, соответствует общественным интересам,
принципам гуманности и морали. Участник подтверждает, что все используемые в проекте
материалы и данные являются его собственностью или использованы с разрешения
правообладателей, что не ограничивает использование проекта Организатором в полном
объеме.

Я подтверждаю, что передача исключительных прав на проект, созданный в рамках
конкурса, не нарушает права третьих лиц и что все материалы проекта могут быть использованы
Организатором без каких-либо ограничений.